# 导入Django表单模块和相关组件
from django import forms
from django.contrib.auth.models import User  # 导入Django内置用户模型
from django.core.exceptions import ValidationError  # 导入表单验证错误类


class LoginForm(forms.Form):
    """普通表单类：用户登录表单（不直接操作数据库）"""
    # 用户名/手机号字段
    username = forms.CharField(
        max_length=11,  # 最大长度11位
        label='请您输入手机号',  # 字段标签
        # 自定义表单控件属性（配合LayUI前端框架）
        widget=forms.widgets.TextInput(
            attrs={
                'class': 'layui-input',  # LayUI输入框样式类
                'placeholder': '请您输入手机号',  # 占位提示文本
                'lay-verify': 'required|phone',  # LayUI验证规则（必填+手机号格式）
                'id': 'username'  # 输入框ID
            }
        )
    )

    # 密码字段
    password = forms.CharField(
        max_length=20,  # 最大长度20位
        label='请您输入密码',  # 字段标签
        # 密码输入框控件（内容自动隐藏）
        widget=forms.widgets.PasswordInput(
            attrs={
                'class': 'layui-input',
                'placeholder': '请您输入密码',
                'lay-verify': 'required|password',
                'id': 'password'
            }
        )
    )

    # 自定义字段验证方法：清洗username数据
    def clean_username(self):
        """验证手机号是否为11位"""
        username = self.cleaned_data['username']  # 获取清洗后的数据
        if len(username) == 11:
            return username  # 验证通过则返回数据
        else:
            # 验证失败则抛出异常（错误信息将显示在表单上）
            raise ValidationError('用户名为手机号码')


class LoginModelForm(forms.ModelForm):
    """模型表单类：继承自ModelForm，可直接操作数据库"""

    class Meta:
        """内部类：定义表单与模型的映射关系"""
        model = User  # 关联Django内置User模型
        fields = ('username', 'password')  # 包含的模型字段

        # 字段标签（覆盖模型中的verbose_name）
        labels = {
            'username': '请您输入手机号',
            'password': '请您输入密码',
        }

        # 错误信息（覆盖默认错误提示）
        error_messages = {
            '__all__': {
                'required': '请输入内容',  # 必填字段错误
                'invalid': '请检查输入内容'  # 格式错误
            },
        }

        # 自定义表单控件属性（同LoginForm）
        widgets = {
            'username': forms.widgets.TextInput(
                attrs={
                    'class': 'layui-input',
                    'placeholder': '请您输入手机号',
                    'lay-verify': 'required|phone',
                    'id': 'username'
                }
            ),
            'password': forms.widgets.PasswordInput(
                attrs={
                    'class': 'layui-input',
                    'placeholder': '请您输入密码',
                    'lay-verify': 'required|password',
                    'id': 'password'
                }
            )
        }

    # 重写字段验证方法（与LoginForm逻辑相同）
    def clean_username(self):
        username = self.cleaned_data['username']
        if len(username) == 11:
            return username
        else:
            raise ValidationError('用户名为手机号码')